package service.impl;

import dao.DataDao;
import entity.User;
import service.DataService;
import util.NetUtil;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 用户聊天记录服务实现类
 * 提供发送/接收消息、获取历史消息等服务
 *
 * @author Mr.Alpaca
 * @version 1.0.0
 */
public class DataServiceImpl implements DataService {
    /**
     * 单例对象
     */
    private static DataService service;
    /**
     * 数据库管理对象
     */
    private static DataDao dao;

    private DataServiceImpl() {
        dao = DataDao.getDao();
    }

    /**
     * 单例,DCL
     *
     * @return 本类单例对象
     */
    public static DataService getService() {
        if (service == null) {
            synchronized (DataServiceImpl.class) {
                if (service == null) {
                    service = new DataServiceImpl();
                }
            }
        }
        return service;
    }

    /**
     * 根据通信双方用户id查找历史消息
     *
     * @param oneId     用户1
     * @param anotherId 用户2
     * @return 历史消息
     */
    @Override
    public String getHistoryMessage(Long oneId, Long anotherId) {
        String id = buildId(oneId, anotherId);
        return dao.selectHistory(id);
    }

    /**
     * 发送信息到指定用户Socket
     *
     * @param text       指定信息
     * @param targetUser 目标用户
     */
    @Override
    public void send(String text, User targetUser) {
        DatagramSocket socket = targetUser.getSocket();
        try {
            NetUtil.sendMessage(text, InetAddress.getLocalHost(), socket.getLocalPort());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 接收消息并添加到历史消息中
     *
     * @param user 接收信息的用户
     */
    @Override
    public void receive(User user) {
        try {
            String message = NetUtil.receiveMessage(user.getSocket());
            String[] split = message.split("\\|");
            long anotherId = Long.parseLong(split[0]);
            // 根据通信双方用户id生成聊天记录索引号
            String id = buildId(user.getId(), anotherId);
            dao.insertMessage(id, split[1]);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * 根据传入参数生成历史消息索引号
     *
     * @param oneId     用户1
     * @param anotherId 用户2
     * @return 历史消息索引
     */
    private String buildId(Long oneId, Long anotherId) {
        String id;
        if (oneId < anotherId) {
            id = oneId + "|" + anotherId;
        } else {
            id = anotherId + "|" + oneId;
        }
        return id;
    }
}
